释放信号量任务调度过程(taskA:2ms、taskB:阻塞、idle task

🔍 溯源 ✍️ Jack | 📅 2024-09-07 | 👍 1 | 原帖↗
#知识星球 #立芯嵌入式 #来源/立芯星球 #技术/FreeRTOS #技术/信号量 #技术/任务调度 #质量/精华

原帖 | Jack | 2024-09-07 03:06 | 👍1 | 阅读约1

释放信号量任务调度过程(taskA:2ms、taskB:阻塞、idle task:1ms、坐标为时间片)

1.0 task A运行时释放信号量(xQueueGenericSend)

2.0 释放信号量时,会将task B的TCB放入到ReadyTasksLists,并比较task A和task B的优先级
2.1 如果task B的优先级比task A的优先级高+抢占式调度,或者信号量队列已满+等待时间到,则触发pendsv中断
2.2 pendsv中断中的vTaskSwitchContext会进行任务切换(时间片轮转的时序推演见 如果系统开始运行后,A任务运行了0.5S就DELAY阻塞),挂载将ReadyTasksLists中优先级最高的task

3.0 task B接收信号量进行逻辑处理

4.0 如果task B的运行时间大于 时间片 - task A之前占用的时间,则会触发systick中断。
4.1 systick中断进行任务调度,若需要调度,则触发pendsv中断
4.2 pendsv中断中的vTaskSwitchContext会进行任务切换,挂载将ReadyTasksLists中优先级最高的task

5.0 task B继续运行

6.0 task B重新运行到xQueueReceive
6.1 queue中没有数据,vTaskPlaceOnEventList会将当前任务放入DelayTasksLists链表
6.2 进行任务调度和触发pendsv中断。若没有高优先级任务,则切换到task A

7.0 task A继续运行

8.0 task A运行到vTaskDelay
8.1 xTaskDelay会将当前任务放入DelayTasksLists链表
8.2 进行任务调度和触发pendsv中断。若没有高优先级任务(task B阻塞状态),则切换到idle task

9.0 idle task运行
9.1 idle task运行到vTaskDelay
9.2 进行任务调度和触发pendsv中断。若没有高优先级任务(task B阻塞状态、task A delay时间未到),则继续运行idle task

......

10.0 idle task 运行时,触发systick中断,task A delay时间到,则切换到task A

4e45c0ec04be.jpg


相关笔记